//
// Description: 285. 没有上司的舞会
// Created by Loading on 2022/6/4.
//

#include <bits/stdc++.h>

using namespace std;

constexpr int N = 6010;

// 快乐指数
int happy[N];
// dp[i][0] 表示不选择节点 i 时的最大快乐指数，dp[i][1] 表示选择节点 i 时的最大快乐指数
int dp[N][2];
// 邻接表存储树
int h[N], e[N], ne[N], idx;
// 是否存在父节点
bool has_father[N];

// 增加一条边
void add(int a, int b) {
    e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}

void dfs(int u) {
    dp[u][1] = happy[u];
    // 遍历 u 的所有下级
    for (int i = h[u]; i != -1; i = ne[i]) {
        int j = e[i];
        dfs(j);

        // 如果不选择 u，则下级可以选择也可以不选择
        dp[u][0] += max(dp[j][0], dp[j][1]);
        // 如果选择 u，则下级不可选择
        dp[u][1] += dp[j][0];
    }
}

int main() {
    int n;
    cin >> n;
    for (int i = 1; i <= n; ++i) {
        cin >> happy[i];
    }

    memset(h, -1, sizeof h);
    for (int i = 0; i < n - 1; ++i) {
        int L, K;
        cin >> L >> K;
        add(K, L);
        has_father[L] = true;
    }
    // 寻找父节点
    int root = 1;
    while (has_father[root]) {
        ++root;
    }

    dfs(root);
    // 输出选择根节点和不选择根节点的最大值
    cout << max(dp[root][0], dp[root][1]) << endl;

    return 0;
}